<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
    </head>
    <body>
        <script>
            /*
                        如果遇到更高的，那么面积一定是增大的。
                        如果遇到矮的，那么面积可能大可能小，所以需要维持一个单调递增栈。
                        当遇到比它小的，就出栈一个topIndex，计算以它为高的元素，宽度是当前i-stack[stack.length-1]-1

                        如果还是比栈顶元素小，继续出栈。计算以其出栈元素为高的大小，因为栈是单调递增栈的，所以之前出栈的绝对比它大
                        类似于5 6 4 ，6先出栈计算以6为高度，然后5出栈，计算以5为高度

                        边界处理：为了保证都能出栈都能入栈，前后加个0

                        宽度处理  0 5 6 4 0  先 5 6入栈，遇到4，6出栈，计算以6为高度，宽度为3-1-1
                        然后5出栈计算以5为高度，宽度为3-0-1=2 面积为10
                        然后4入栈，遇到0，4出栈，计算以高度为4，宽度为4-0-1  (这个-1就是为了最后这个0入栈，前面的全出栈，前面还多个0，所以宽度-1)

                        */
            var largestRectangleArea = function (heights) {
                let maxArea = 0
                const stack = []
                heights = [0, ...heights, 0]
                for (let i = 0; i < heights.length; i++) {
                    while (heights[i] < heights[stack[stack.length - 1]]) {
                        let topIndex = stack.pop()
                        maxArea = Math.max(maxArea, heights[topIndex] * (i - stack[stack.length - 1] - 1))
                    }
                    stack.push(i)
                }
                return maxArea
            }
            console.log(largestRectangleArea([5, 6, 4]))
        </script>
    </body>
</html>
